// TODO 思维
/*
  1. 发送请求 [A]
    if 1500 重新发送
    else 等待结果  
      if 新请求 [A, B]
        if 1500 重新发送[A, B => C] ==> [A, C]
      结果完成 [A, B].splice(0) ==> [B]   
      back 1.发送请求 [B]
*/
class ThrottingRequest {
  constructor() {
    this.taskQueue = []; // 请求队列数组
    this.requestState = false; // 是否有请求进行中
    this.timer = null; // 定时器
    this.delay = 0; // 间隔时间
  }

  // 进入任务队列
  pushTaskQueue(requestFn) {
    if (this.taskQueue.length === 0) {
      this.taskQueue.push(requestFn); // 添加进入队列的请求
    } else {
      this.taskQueue.splice(0, 1, requestFn); // 替换队列请求
    }
  }

  // 添加请求 判断定时器 是否重置请求
  addTaskQueue(requestFn, countdown = 1500) {
    // 存在请求中状态
    if (this.requestState) {
      this.pushTaskQueue(requestFn);
    } else {
      const nowTime = Date.now(); // 当前时间
      if (nowTime - this.delay < countdown) clearTimeout(this.timer);
      this.timer = setTimeout(() => {
        requestFn(); // 发送请求
        this.requesting(); // 改变请求状态为请求中
      }, countdown)
      this.delay = nowTime;
    }
  }

  // 请求中 
  requesting() {
    this.requestState = true;
  }

  // 请求结束
  requestEnd() {
    this.requestState = false;
    if (this.taskQueue.length !== 0) {
      // 取出任务队列中的请求方法，进行发送
      this.addTaskQueue(this.taskQueue.splice(0, 1)[0])
    }
  }
}